package com.br.objetos;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;

import com.br.outros.Conexao;
import com.br.outros.DateUtils;
import com.br.outros.MailSenderMobile;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;

public class ConviteMobile {

	// public void

	public static boolean insertConvite(GrupoMobile grupo, String latitude,
			String longitude, String horaEncontro, String minutoEncontro,
			String login) {
		// INSERIR NA CONVITE TODOS OS INTEGRANTES DO GRUPO
		// INSERIR NA GRUPOCONVITE O ID DO GRUPO
		// INSERIR NA CONVITE O IDGRUPOCONVITE PARA O GRUPO
		boolean res = false;
		// System.out.println(grupo.getIdGrupo());
		int idGrupo = grupo.getIdGrupo();
		// Statement st = null;
		// ResultSet rs = null;
		Connection con;
		// String URL = "jdbc:mysql://localhost:3306/test";
		// String USE = "root";
		// String PASS = "";
		String driver = Conexao.getDriver();
		String URL = Conexao.getURL();
		String USE = Conexao.getUSE();
		String PASS = Conexao.getPASS();
		String sql = "";
		int idGrupoConvite = 0;
		try {
			Class.forName(driver);
			con = DriverManager.getConnection(URL, USE, PASS);
			Statement stmt = con.createStatement();

			// INSERIU NO GRUPO CONVITE
			sql = "INSERT INTO GRUPOCONVITE (IDGRUPO, DTCADASTRO) VALUES ("
					+ idGrupo + ", CURDATE());";
			stmt.executeUpdate(sql);

			sql = "SELECT MAX(IDGRUPOCONVITE) AS ULTIMOID FROM GRUPOCONVITE WHERE IDGRUPO = "
					+ idGrupo;
			// System.out.println(sql);
			// PEGAR ID DO GRUPOCONVITE DE ACORDO COM O GRUPO E DATA

			Statement st = null;
			ResultSet rs = null;

			st = con.createStatement();
			rs = st.executeQuery(sql);

			if (rs.next()) {
				idGrupoConvite = rs.getInt("ULTIMOID");
				// System.out.println(idGrupoConvite);
			}

			// PEGAR TODOS OS INTEGRANTES DO GRUPO

			sql = "SELECT IDCLIENTE AS IDCLIENTE FROM CLIENTEGRUPO WHERE IDGRUPO = "
					+ idGrupo;
			// System.out.println(sql);
			// PEGAR ID DO GRUPOCONVITE DE ACORDO COM O GRUPO E DATA

			st = con.createStatement();
			rs = st.executeQuery(sql);
			ArrayList<Integer> lista = new ArrayList<Integer>();
			int temp = 0;
			while (rs.next()) {
				temp = rs.getInt("IDCLIENTE");
				// System.out.println(temp);
				lista.add(temp);
			}
			Date tempoespera = new Date();
			// pegou ids dos cliente do grupo

			// inserir todos os clientes do grupo na tb convite com o
			// idgrupoconvite

			try {
				SimpleDateFormat df = new SimpleDateFormat("HH:mm");
				Date horaInicio = df.parse(horaEncontro + ":" + minutoEncontro);
				// cria um StringBuilder
				String sb = "";

				// cria um GregorianCalendar que vai conter a hora atual
				GregorianCalendar d = new GregorianCalendar();

				sb = d.get(GregorianCalendar.HOUR_OF_DAY) + ":"
						+ d.get(GregorianCalendar.MINUTE);
				Date horaFim = df.parse(sb);
				System.out
						.println("-------------------\n"
								+ "ENTROU NA CALCULAR TEMPO DE ESPERA --> NAO FUNFANDO --> VERIFICAR \n"
								+ DateUtils.now() + "\n"
								+ "-------------------");
				// tempoespera = retornarHorasDeDiferenca(horaInicio, horaFim);
				// System.out.println(tempoespera);
			} catch (java.text.ParseException parse) {
				parse.printStackTrace();
				MailSenderMobile mail = new MailSenderMobile();
				mail.enviaEmailsErro("ERRO CONVITE MOBILE - INSERT<BR />\n"
						+ parse.toString());
				res = false;
			}

			//
			// SELECT IDCLIENTE FROM CLIENTEGRUPO where IDGRUPO = 2;

			for (Integer var : lista) {
				sql = "INSERT INTO CONVITE (IDGRUPOCONVITE, IDCLIENTE, LATITUDE, LONGITUDE, DATACONVITE, HORARIO, TEMCONVITE, CONVITEACEITO, CONVITEFINALIZADO, NOTIFICACAO) VALUES ("
						+ idGrupoConvite
						+ ",'"
						+ var
						+ "','"
						+ latitude
						+ "','"
						+ longitude
						+ "',CURDATE(),'"
						+ horaEncontro
						+ ":" + minutoEncontro + "',TRUE,FALSE,FALSE, FALSE)";
				// System.out.println(sql);
				stmt.executeUpdate(sql);
			}

			int idCliente = getClienteByCelular(Integer.valueOf(login));
			sql = "UPDATE CONVITE SET CONVITEACEITO = TRUE WHERE IDGRUPOCONVITE = "
					+ idGrupoConvite + " AND IDCLIENTE = " + idCliente;
			stmt = con.createStatement();
			stmt.executeUpdate(sql);

			sql = "UPDATE CONVITE SET CONVITEFINALIZADO = TRUE WHERE IDGRUPOCONVITE = "
					+ idGrupoConvite + " AND IDCLIENTE = " + idCliente;
			stmt = con.createStatement();
			stmt.executeUpdate(sql);

			sql = "UPDATE CONVITE SET TEMCONVITE = FALSE WHERE IDGRUPOCONVITE = "
					+ idGrupoConvite + " AND IDCLIENTE = " + idCliente;
			stmt = con.createStatement();
			stmt.executeUpdate(sql);

			res = true;
			con.close();

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			MailSenderMobile mail = new MailSenderMobile();
			mail.enviaEmailsErro("ERRO CONVITE MOBILE - INSERT<BR />\n"
					+ e.toString());
			res = false;
		}
		return res;
	}

	public static int getClienteByCelular(int telefone) {
		Connection con;
		// String URL = "jdbc:mysql://localhost:3306/test";
		// String USE = "root";
		// String PASS = "";
		String driver = Conexao.getDriver();
		String URL = Conexao.getURL();
		String USE = Conexao.getUSE();
		String PASS = Conexao.getPASS();
		String sql = "";
		int idCliente = 0;
		try {
			Class.forName(driver);
			con = DriverManager.getConnection(URL, USE, PASS);
			Statement stmt = con.createStatement();

			sql = "SELECT IDCLIENTE AS IDCLIENTE FROM CLIENTE_CELULAR WHERE LOGIN = "
					+ telefone;
			// System.out.println(sql);
			// PEGAR ID DO GRUPOCONVITE DE ACORDO COM O GRUPO E DATA

			Statement st = null;
			ResultSet rs = null;

			st = con.createStatement();
			rs = st.executeQuery(sql);

			if (rs.next()) {
				idCliente = rs.getInt("IDCLIENTE");
				// System.out.println(idCliente);
				// res = "OK";
			}

			sql = "UPDATE CONVITE SET TEMCONVITE = FALSE WHERE IDCLIENTE = "
					+ idCliente;
			stmt = con.createStatement();
			stmt.executeUpdate(sql);

			con.close();

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			MailSenderMobile mail = new MailSenderMobile();
			mail.enviaEmailsErro("ERRO CONVITE MOBILE - GET CLIENTE BY CELULAR<BR />\n"
					+ e.toString());
			// return "NOT";
		}

		return idCliente;
	}

	public static boolean existeConvite(String telefone) {
		Connection con;
		String driver = Conexao.getDriver();
		String URL = Conexao.getURL();
		String USE = Conexao.getUSE();
		String PASS = Conexao.getPASS();
		String sql = "";
		boolean res = false;
		int idConvite = 0;
		try {
			Class.forName(driver);
			con = DriverManager.getConnection(URL, USE, PASS);
			Statement stmt = con.createStatement();

			// INSERIU NO GRUPO CONVITE
			sql = "SELECT C.IDCONVITE AS IDCONVITE FROM CONVITE C JOIN CLIENTE_CELULAR CC ON (CC.IDCLIENTE = C.IDCLIENTE AND CC.TELEFONE = '"
					+ telefone + "') " + " WHERE TEMCONVITE = TRUE;";
			// System.out.println(sql);
			// PEGAR ID DO GRUPOCONVITE DE ACORDO COM O GRUPO E DATA

			Statement st = null;
			ResultSet rs = null;

			st = con.createStatement();
			rs = st.executeQuery(sql);

			if (rs.next()) {
				idConvite = rs.getInt("IDCONVITE");
				// System.out.println(idConvite);
				res = true;
			}
			con.close();

		} catch (Exception e) {
			e.printStackTrace();
			MailSenderMobile mail = new MailSenderMobile();
			mail.enviaEmailsErro("ERRO CONVITE MOBILE - EXISTE CONVITE<BR />\n"
					+ e.toString());
			return false;
		}

		return res;
	}

	public static Date retornarHorasDeDiferenca(Date dtInic, Date dtFim) {
		// constr—i a primeira data
		DateFormat fm = new SimpleDateFormat("HH:mm");
		Date data1 = dtInic;

		// constr—i a segunda data
		fm = new SimpleDateFormat("HH:mm");
		Date data2 = dtFim;

		// vamos obter a diferen�a em semanas, dias, horas,
		// minutos e segundos
		long segundos = (data2.getTime() - data1.getTime()) / 1000;
		int semanas = (int) Math.floor(segundos / 604800);
		segundos -= semanas * 604800;
		int dias = (int) Math.floor(segundos / 86400);
		segundos -= dias * 86400;
		int horas = (int) Math.floor(segundos / 3600);
		segundos -= horas * 3600;
		int minutos = (int) Math.floor(segundos / 60);
		segundos -= minutos * 60;

		if (segundos < 0)
			segundos *= -1;

		if (semanas < 0)
			semanas *= -1;

		if (dias < 0)
			dias *= -1;

		if (horas < 0)
			horas *= -1;

		if (minutos < 0)
			minutos *= -1;

		// exibe o resultado
		// System.out.println("As duas datas tem " + semanas + " semanas, " +
		// dias
		// + " dias, " + horas + " horas, " + minutos + " minutos e "
		// + segundos + " segundos de diferen�a");

		SimpleDateFormat df = new SimpleDateFormat("HH:mm");
		Date dtRes = new Date();
		try {
			dtRes = df.parse(horas + ":" + minutos);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			MailSenderMobile mail = new MailSenderMobile();
			mail.enviaEmailsErro("ERRO CONVITE MOBILE - retornarHorasDeDiferenca<BR />\n"
					+ e.toString());
		}

		return dtRes;
	}

	public static boolean updateConvite(int idConvite, int idGrupo,
			String latitude, String longitude, String horaEncontro,
			String minutoEncontro, String login) {

		boolean res = false;
		// Statement st = null;
		// ResultSet rs = null;
		Connection con;
		// String URL = "jdbc:mysql://localhost:3306/test";
		// String USE = "root";
		// String PASS = "";
		String driver = Conexao.getDriver();
		String URL = Conexao.getURL();
		String USE = Conexao.getUSE();
		String PASS = Conexao.getPASS();
		String sql = "";
		try {
			Class.forName(driver);
			con = DriverManager.getConnection(URL, USE, PASS);
			Statement stmt = con.createStatement();

			sql = "UPDATE CONVITE SET " + "IDGRUPO = " + idGrupo
					+ ",IDCLIENTE = " + login + ",LATITUDE ='" + latitude + "'"
					+ ",LONGITUDE ='" + longitude + "' where IDCONVITE = "
					+ idConvite + ";";
			// BOOLEAN CONVITEACEITO = TRUE
			// THREAD
			// TABELA NOVA

			stmt.executeUpdate(sql);
			res = true;
			con.close();

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			res = false;
			MailSenderMobile mail = new MailSenderMobile();
			mail.enviaEmailsErro("ERRO CONVITE MOBILE - UPDATE CONVITE<BR />\n"
					+ e.toString());
		}
		return res;
	}

	private int idConvite;
	private Date dataConvite;
	private String horario;
	private int idGrupoConvite;
	private int idBar;
	private String tempoEspera;
	private int idCliente;
	private String latitude;
	private String longitude;
	private boolean temConvite;
	private boolean conviteAceito;
	public String apelido;
	public int idGrupo;

	// public int idGrupoConvite;

	public String getApelido() {
		return apelido;
	}

	public int getIdGrupo() {
		return idGrupo;
	}

	public void setIdGrupo(int idGrupo) {
		this.idGrupo = idGrupo;
	}

	public void setApelido(String apelido) {
		this.apelido = apelido;
	}

	public int getIdConvite() {
		return idConvite;
	}

	public void setIdConvite(int idConvite) {
		this.idConvite = idConvite;
	}

	public Date getDataConvite() {
		return dataConvite;
	}

	public void setDataConvite(Date dataConvite) {
		this.dataConvite = dataConvite;
	}

	public String getHorario() {
		return horario;
	}

	public void setHorario(String horario) {
		this.horario = horario;
	}

	public int getIdGrupoConvite() {
		return idGrupoConvite;
	}

	public void setIdGrupoConvite(int idGrupoConvite) {
		this.idGrupoConvite = idGrupoConvite;
	}

	public int getIdBar() {
		return idBar;
	}

	public void setIdBar(int idBar) {
		this.idBar = idBar;
	}

	public String getTempoEspera() {
		return tempoEspera;
	}

	public void setTempoEspera(String tempoEspera) {
		this.tempoEspera = tempoEspera;
	}

	public int getIdCliente() {
		return idCliente;
	}

	public void setIdCliente(int idCliente) {
		this.idCliente = idCliente;
	}

	public String getLatitude() {
		return latitude;
	}

	public void setLatitude(String latitude) {
		this.latitude = latitude;
	}

	public String getLongitude() {
		return longitude;
	}

	public void setLongitude(String longitude) {
		this.longitude = longitude;
	}

	public boolean isTemConvite() {
		return temConvite;
	}

	public void setTemConvite(boolean temConvite) {
		this.temConvite = temConvite;
	}

	public boolean isConviteAceito() {
		return conviteAceito;
	}

	public void setConviteAceito(boolean conviteAceito) {
		this.conviteAceito = conviteAceito;
	}

	public ConviteMobile(int idConvite, Date dataConvite, String horario,
			int idGrupoConvite, int idBar, String tempoEspera, int idCliente,
			String latitude, String longitude, boolean temConvite,
			boolean conviteAceito, String apelido, int idGrupo) {
		super();
		this.conviteAceito = conviteAceito;
		this.dataConvite = dataConvite;
		this.horario = horario;
		this.idBar = idBar;
		this.idCliente = idCliente;
		this.idConvite = idConvite;
		this.idGrupoConvite = idGrupoConvite;
		this.latitude = latitude;
		this.longitude = longitude;
		this.temConvite = temConvite;
		this.tempoEspera = tempoEspera;
		this.apelido = apelido;
		this.idGrupo = idGrupo;

	}

	public ConviteMobile() {
		super();

	}

	public ConviteMobile(ConviteMobile conv) {
		super();
		this.conviteAceito = conv.isConviteAceito();
		this.dataConvite = conv.getDataConvite();
		this.horario = conv.getHorario();
		this.idBar = conv.getIdBar();
		this.idCliente = conv.getIdCliente();
		this.idConvite = conv.getIdConvite();
		this.idGrupoConvite = conv.getIdGrupoConvite();
		this.latitude = conv.getLatitude();
		this.longitude = conv.getLongitude();
		this.temConvite = conv.isTemConvite();
		this.tempoEspera = conv.getTempoEspera();
		this.apelido = conv.getApelido();
		this.idGrupo = conv.getIdGrupo();

	}

	public static String serialize(ConviteMobile obj) {
		XStream xstream = new XStream(new DomDriver());
		xstream.setMode(XStream.NO_REFERENCES);
		xstream.alias("convite", ConviteMobile.class);
		String serialize = xstream.toXML(obj);
		return serialize;
	}

	public static String mostrarConvite(int nrCelular) {
		String convite = "";
		boolean res = false;
		Statement st = null;
		ResultSet rs = null;
		// String driver = "com.mysql.jdbc.Driver";
		Connection con;
		// String URL = "jdbc:mysql://localhost:3306/test";
		// String USE = "root";
		// String PASS = "";
		ConviteMobile conv = null;
		String driver = Conexao.getDriver();
		String URL = Conexao.getURL();
		String USE = Conexao.getUSE();
		String PASS = Conexao.getPASS();
		// ArrayList<String[]> lista = new ArrayList<String[]>();
		try {
			Class.forName(driver);
			con = DriverManager.getConnection(URL, USE, PASS);
			st = con.createStatement();

			String sql = "SELECT GRUPOCON.IDGRUPOCONVITE AS IDGRUPOCONVITE, GRUPOCON.IDGRUPO AS IDGRUPO, GR.APELIDO AS APELIDO, CON.HORARIO AS HORARIO, CON.TEMPOESPERA AS TEMPOESPERA, CON.IDCONVITE AS IDCONVITE "
					+ " FROM CONVITE CON "
					+ " JOIN GRUPOCONVITE GRUPOCON ON (GRUPOCON.IDGRUPOCONVITE = CON.IDGRUPOCONVITE) "
					+ " JOIN GRUPO GR ON (GR.IDGRUPO = GRUPOCON.IDGRUPO) "
					+ " WHERE CON.IDCLIENTE = (SELECT IDCLIENTE FROM CLIENTE_CELULAR WHERE TELEFONE = '"
					+ nrCelular + "');";

			// Buscar Alunos
			st = con.createStatement();
			rs = st.executeQuery(sql);

			while (rs.next()) {
				String[] vet = new String[6];
				vet[0] = rs.getString("IDGRUPO");
				vet[1] = rs.getString("APELIDO");
				vet[2] = rs.getString("HORARIO");
				vet[3] = rs.getString("TEMPOESPERA");
				vet[4] = rs.getString("IDCONVITE");
				vet[5] = rs.getString("IDGRUPOCONVITE");
				conv = new ConviteMobile();
				conv.setIdGrupo(Integer.valueOf(vet[0]));
				conv.setApelido(vet[1]);
				conv.setHorario(vet[2]);
				conv.setTempoEspera(vet[3]);
				conv.setIdConvite(Integer.valueOf(vet[4]));
				conv.setIdGrupoConvite(Integer.valueOf(vet[5]));

				sql = "UPDATE CONVITE SET TEMCONVITE = FALSE WHERE IDCONVITE = "
						+ conv.getIdConvite() + ";";
				st = con.createStatement();
				st.executeUpdate(sql);

				// arrayConvite.add(conv);

				// lista.add(vet);
			}

			convite = ConviteMobile.serialize(conv);

			// return id;
			// System.out.println(sql);
			// mapConvites.put("arrayConvites", arrayConvite);
			con.close();

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			MailSenderMobile mail = new MailSenderMobile();
			mail.enviaEmailsErro("ERRO CONVITE MOBILE - mostrarConvite<BR />\n"
					+ e.toString());
		}
		return convite;
	}

	/**
	 * Método que responde se o convite foi aceito ou não.
	 */
	public static String responderConvite(int idConvite, String resposta,
			String latitude, String longitude) {
		String retorno = "";
		Statement st = null;
		Connection con;
		String URL = "jdbc:mysql://177.19.155.153:3306/proximob_final";
		String USE = "proximob_acesso";
		String PASS = "ihNETLtlG2";
		String sql = "";
		// updateConvite(idConvite, idGrupo, latitude, longitude, horaEncontro,
		// minutoEncontro, login);
		try {

			Class.forName("com.mysql.jdbc.Driver");
			con = DriverManager.getConnection(URL, USE, PASS);
			st = con.createStatement();
			sql = "UPDATE CONVITE SET CONVITEACEITO = "
					+ ("true".equals(resposta) ? 1 : 0) + " WHERE IDCONVITE = "
					+ idConvite + ";";
			st = con.createStatement();
			st.executeUpdate(sql);

			// sql =
			// "UPDATE CONVITE SET CONVITEFINALIZADO = FALSE WHERE IDCONVITE = "
			// + idConvite + ";";
			st = con.createStatement();
			st.executeUpdate(sql);

			sql = "UPDATE CONVITE SET TEMCONVITE = FALSE WHERE IDCONVITE = "
					+ idConvite + ";";
			st = con.createStatement();
			st.executeUpdate(sql);

			sql = "UPDATE CONVITE SET LATITUDE = '" + latitude
					+ "' WHERE IDCONVITE = " + idConvite + ";";
			st = con.createStatement();
			st.executeUpdate(sql);

			sql = "UPDATE CONVITE SET LONGITUDE = '" + longitude
					+ "' WHERE IDCONVITE = " + idConvite + ";";
			st = con.createStatement();
			st.executeUpdate(sql);

			con.close();
			retorno = "OK";

		} catch (Exception e) {
			e.printStackTrace();
			MailSenderMobile mail = new MailSenderMobile();
			mail.enviaEmailsErro("ERRO CONVITE MOBILE - responderConvite<BR />\n"
					+ e.toString());
			retorno = "NOT";
		}
		return retorno;
	}

	
	public static int verificaTodosAceitaramConvite(int idGrupoConvite, int idCliente) {
		Statement st = null;
		ResultSet rs = null;
		Connection con = null;
		
		String URL = Conexao.getURL();
		String USE = Conexao.getUSE();
		String PASS = Conexao.getPASS();
		String sql = "";
		int cont = 0;
		try {

			Class.forName(Conexao.getDriver());
			con = DriverManager.getConnection(URL, USE, PASS);
			st = con.createStatement();
			sql = "SELECT CONVITEFINALIZADO AS CONVITEFINALIZADO FROM CONVITE WHERE CONVITEFINALIZADO = TRUE AND IDGRUPOCONVITE = "
					+ idGrupoConvite + " AND IDCLIENTE = " + idCliente + " ;";
			st = con.createStatement();
			rs = st.executeQuery(sql);
			if (rs.next()) {
				cont++;
			}
			con.close();
		} catch (Exception e) {
			e.printStackTrace();
			MailSenderMobile mail = new MailSenderMobile();
			mail.enviaEmailsErro("ERRO CONVITE MOBILE - responderConvite<BR />\n" + e.toString());
			try {
				con.close();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
		}
		return cont;
	}
}
